package com.it.schoolbookshop_back.service;

import com.it.schoolbookshop_back.entities.po.Book;
import com.it.schoolbookshop_back.entities.dto.BookResponseDTO;
import com.it.schoolbookshop_back.entities.dto.BookAddDTO;
import com.it.schoolbookshop_back.entities.dto.BookEditDTO;
import com.it.schoolbookshop_back.entities.dto.SoldBookDTO;
import com.it.schoolbookshop_back.enums.BookConditionEnum;
import com.it.schoolbookshop_back.enums.BookStatusEnum;
import com.it.schoolbookshop_back.enums.PriceRangeEnum;
import com.it.schoolbookshop_back.enums.SortByEnum;

import java.util.List;

/**
 * 书籍服务接口
 */
public interface BookService {
    
    /**
     * 获取书籍列表，支持按价格区间、品相过滤，并可指定排序方式
     * @param priceRange 价格区间
     * @param bookCondition 书本品相
     * @param sort 排序方式
     * @return 书籍列表
     */
    List<Book> getBooks(PriceRangeEnum priceRange, BookConditionEnum bookCondition, SortByEnum sort);

    /**
     * 获取书籍列表（包含卖家信息），支持按价格区间、品相过滤，并可指定排序方式
     * @param priceRange 价格区间
     * @param bookCondition 书本品相
     * @param sort 排序方式
     * @return 包含卖家信息的书籍列表
     */
    List<BookResponseDTO> getBooksWithSeller(PriceRangeEnum priceRange, BookConditionEnum bookCondition, SortByEnum sort);
    
    /**
     * 获取用户发布的书籍，可根据状态筛选
     * @param sellerId 卖家ID
     * @param status 书籍状态值（可以为null，表示查询所有状态）
     * @return 书籍列表
     */
    List<Book> getBooksBySeller(Integer sellerId, String status);
    
    /**
     * 添加新书籍
     * 
     * @param bookAddDTO 书籍添加DTO
     * @param sellerId 卖家ID
     * @return 添加的书籍ID，失败返回null
     */
    Integer addBook(BookAddDTO bookAddDTO, Integer sellerId);
    
    /**
     * 获取推荐书籍
     * 根据指定书籍ID，查找同类别或同作者的书籍
     * 
     * @param bookId 参考书籍ID
     * @return 推荐书籍列表，最多6本
     */
    List<BookResponseDTO> getRecommendBooks(Integer bookId);
    
    /**
     * 根据ID获取单本书籍的详细信息（包含卖家和分类信息）
     * 
     * @param bookId 书籍ID
     * @return 书籍详细信息
     */
    BookResponseDTO getBookDetailById(Integer bookId);
    
    /**
     * 根据ID获取单本书籍的基础信息
     * 
     * @param bookId 书籍ID
     * @return 书籍基础信息
     */
    Book getBookById(Integer bookId);
    
    /**
     * 更新书籍状态
     * 
     * @param bookId 书籍ID
     * @param status 新状态
     * @return 更新是否成功
     */
    boolean updateBookStatus(Integer bookId, String status);
    
    /**
     * 增加书籍浏览次数
     * 用户同一时间内重复浏览同一本书浏览次数不会增加，除非时间过期，缓存时间十分钟
     * 
     * @param bookId 书籍ID
     * @param userId 用户ID
     * @return 是否成功增加浏览次数
     */
    boolean incrementBookViews(Integer bookId, Integer userId);
    
    /**
     * 删除单本书籍，同时级联删除相关的收藏记录
     * 
     * @param bookId 书籍ID
     * @return 是否删除成功
     */
    boolean deleteBook(Integer bookId);
    
    /**
     * 编辑书籍信息
     * 
     * @param bookEditDTO 书籍编辑DTO
     * @param userId 当前用户ID（用于验证是否是书籍所有者）
     * @return 是否编辑成功
     */
    boolean editBook(BookEditDTO bookEditDTO, Integer userId);
    
    /**
     * 获取已售出的书籍
     * 根据用户ID查询该用户已售出的书籍信息
     * 
     * @param sellerId 卖家ID
     * @return 已售出的书籍列表
     */
    List<SoldBookDTO> getSoldBooks(Integer sellerId);
    
    /**
     * 获取已购买的书籍
     * 根据用户ID查询该用户已购买的书籍信息
     * 
     * @param buyerId 买家ID
     * @return 已购买的书籍列表
     */
    List<SoldBookDTO> getBoughtBooks(Integer buyerId);
} 